{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "## 神经网络学习过程\n",
    "* 1.随机选取小批量训练数据\n",
    "* 2.计算梯度\n",
    "* 3.跟新参数\n",
    "* 4.重复1、2、3"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [],
   "source": [
    "# 2层神经网络的类\n",
    "\n",
    "import sys, os\n",
    "sys.path.append(os.pardir)\n",
    "import numpy as np\n",
    "from common import functions, gradient\n",
    "\n",
    "class TwoLayerNet:\n",
    "    def __init__(self, input_size, hidden_size, output_size, weight_init_std=0.01):\n",
    "        \"\"\"\n",
    "        初始化权重\n",
    "        :param input_size:  输入层节点数量\n",
    "        :param hidden_size: 隐藏层节点数量\n",
    "        :param output_size: 输出层节点数量\n",
    "        :param weight_init_std: 初始化权重系数\n",
    "        \"\"\"\n",
    "        self.params = {}\n",
    "        self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)\n",
    "        self.params['b1'] = np.zeros(hidden_size)\n",
    "        self.params['W2'] = weight_init_std * np.random.randn(hidden_size, output_size)\n",
    "        self.params['b2'] = np.zeros(output_size)\n",
    "\n",
    "    def predict(self, x):\n",
    "        \"\"\"\n",
    "        推理方法\n",
    "        :param x:   输入数据\n",
    "        :return:    推理结果\n",
    "        \"\"\"\n",
    "        W1, W2 = self.params['W1'], self.params['W2']\n",
    "        b1, b2 = self.params['b1'], self.params['b2']\n",
    "\n",
    "        a1 = np.dot(x, W1) + b1\n",
    "        z1 = functions.sigmoid(a1)\n",
    "        a2 = np.dot(z1, W2) + b2\n",
    "        y = functions.softmax(a2)\n",
    "\n",
    "        return y\n",
    "\n",
    "    def loss(self, x, t):\n",
    "        \"\"\"\n",
    "        损失函数\n",
    "        :param x: 输入数据\n",
    "        :param t: 监督数据\n",
    "        :return:  损失函数值\n",
    "        \"\"\"\n",
    "        y = self.predict(x)\n",
    "        return functions.cross_entropy_error(y, t)\n",
    "\n",
    "    def accuracy(self, x, t):\n",
    "        \"\"\"\n",
    "        统计精确度\n",
    "        :param x: 输入数据\n",
    "        :param t: 监督数据\n",
    "        :return:  正确率\n",
    "        \"\"\"\n",
    "        y = self.predict(x)\n",
    "        y = np.argmax(y, axis=1)\n",
    "        t = np.argmax(t, axis=1)\n",
    "\n",
    "        accuracy = np.sum(y == t) / float(x.shape[0])\n",
    "        return accuracy\n",
    "\n",
    "    def numerical_gradient(self, x, t):\n",
    "        \"\"\"\n",
    "        权重梯度计算\n",
    "        :param x:   输入数据\n",
    "        :param t:   监督数据\n",
    "        :return:    梯度字典\n",
    "        \"\"\"\n",
    "        loss_W = lambda W: self.loss(x, t)\n",
    "        import time\n",
    "        begin_time = time.time()\n",
    "        grads = {}\n",
    "        grads['W1'] = gradient.numerical_gradient(loss_W, self.params['W1'])\n",
    "        time_w1 = time.time()\n",
    "        print(\"W1: \", (time_w1 - begin_time))\n",
    "        grads['b1'] = gradient.numerical_gradient(loss_W, self.params['b1'])\n",
    "        time_b1 = time.time()\n",
    "        print(\"b1: \", (time_b1 - time_w1))\n",
    "        grads['W2'] = gradient.numerical_gradient(loss_W, self.params['W2'])\n",
    "        time_w2 = time.time()\n",
    "        print(\"W2: \", (time_w2 - time_b1))\n",
    "        grads['b2'] = gradient.numerical_gradient(loss_W, self.params['b2'])\n",
    "        time_b2 = time.time()\n",
    "        print(\"b2: \", (time_w2 - time_b2))\n",
    "\n",
    "        return grads\n",
    "\n",
    "    def gradient(self, x, t):\n",
    "        W1, W2 = self.params['W1'], self.params['W2']\n",
    "        b1, b2 = self.params['b1'], self.params['b2']\n",
    "        grads = {}\n",
    "\n",
    "        batch_num = x.shape[0]\n",
    "\n",
    "        # forward\n",
    "        a1 = np.dot(x, W1) + b1\n",
    "        z1 = functions.sigmoid(a1)\n",
    "        a2 = np.dot(z1, W2) + b2\n",
    "        y = functions.softmax(a2)\n",
    "\n",
    "        # backward\n",
    "        dy = (y - t) / batch_num\n",
    "        grads['W2'] = np.dot(z1.T, dy)\n",
    "        grads['b2'] = np.sum(dy, axis=0)\n",
    "\n",
    "        da1 = np.dot(dy, W2.T)\n",
    "        dz1 = functions.sigmoid_grad(a1) * da1\n",
    "        grads['W1'] = np.dot(x.T, dz1)\n",
    "        grads['b1'] = np.sum(dz1, axis=0)\n",
    "\n",
    "        return grads"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(784, 100)\n",
      "(100,)\n",
      "(100, 10)\n",
      "(10,)\n"
     ]
    }
   ],
   "source": [
    "# 权重初始化\n",
    "\n",
    "net = TwoLayerNet(input_size=784, hidden_size=100, output_size=10)\n",
    "print(net.params['W1'].shape)\n",
    "print(net.params['b1'].shape)\n",
    "print(net.params['W2'].shape)\n",
    "print(net.params['b2'].shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2\n",
      " 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2]\n"
     ]
    }
   ],
   "source": [
    "# 推理处理\n",
    "\n",
    "x = np.random.rand(100, 784)\n",
    "y = net.predict(x)\n",
    "print(np.argmax(y, axis=1))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(784, 100)\n",
      "(100,)\n",
      "(100, 10)\n",
      "(10,)\n"
     ]
    }
   ],
   "source": [
    "# 梯度信息\n",
    "\n",
    "x = np.random.rand(100, 784)\n",
    "t = np.random.rand(100, 10)\n",
    "\n",
    "#grads = net.numerical_gradient(x, t)\n",
    "grads = net.gradient(x, t)\n",
    "\n",
    "print(grads['W1'].shape)\n",
    "print(grads['b1'].shape)\n",
    "print(grads['W2'].shape)\n",
    "print(grads['b2'].shape)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 train acc, test acc |0.11236666666666667, 0.1135\n",
      "600 train acc, test acc |0.7806166666666666, 0.7846\n",
      "1200 train acc, test acc |0.878, 0.8813\n",
      "1800 train acc, test acc |0.8988833333333334, 0.9025\n",
      "2400 train acc, test acc |0.9091, 0.9122\n",
      "3000 train acc, test acc |0.915, 0.9177\n",
      "3600 train acc, test acc |0.9203333333333333, 0.9217\n",
      "4200 train acc, test acc |0.9239833333333334, 0.9266\n",
      "4800 train acc, test acc |0.9280833333333334, 0.9303\n",
      "5400 train acc, test acc |0.9317833333333333, 0.9336\n",
      "6000 train acc, test acc |0.9343666666666667, 0.9348\n",
      "6600 train acc, test acc |0.93755, 0.9369\n",
      "7200 train acc, test acc |0.93965, 0.9387\n",
      "7800 train acc, test acc |0.9417166666666666, 0.9412\n",
      "8400 train acc, test acc |0.9436833333333333, 0.9419\n",
      "9000 train acc, test acc |0.9454833333333333, 0.9442\n",
      "9600 train acc, test acc |0.9476833333333333, 0.9451\n",
      "10200 train acc, test acc |0.9490833333333333, 0.9472\n",
      "10800 train acc, test acc |0.9501833333333334, 0.9478\n",
      "11400 train acc, test acc |0.9516, 0.951\n",
      "12000 train acc, test acc |0.9528833333333333, 0.9511\n",
      "12600 train acc, test acc |0.9541166666666666, 0.951\n",
      "13200 train acc, test acc |0.9552, 0.9523\n",
      "13800 train acc, test acc |0.9565333333333333, 0.9534\n",
      "14400 train acc, test acc |0.9570833333333333, 0.953\n",
      "15000 train acc, test acc |0.9587166666666667, 0.9543\n",
      "15600 train acc, test acc |0.95935, 0.955\n",
      "16200 train acc, test acc |0.96, 0.9562\n",
      "16800 train acc, test acc |0.96085, 0.9573\n",
      "17400 train acc, test acc |0.9618166666666667, 0.9565\n",
      "18000 train acc, test acc |0.9624666666666667, 0.958\n",
      "18600 train acc, test acc |0.9635166666666667, 0.9581\n",
      "19200 train acc, test acc |0.9641333333333333, 0.9587\n",
      "19800 train acc, test acc |0.9647166666666667, 0.9597\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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ue666+wpNgcaGxv1wQ9+UCUlJZo4caJuuOEG7d+/P2Wd7u5urV69WuPHj1dxcbE+85nPqKWlxaaKrZXO/vjIRz5y1jGyatUqmyq21g9/+EPNmTMnOctqXV2d/vu//zv5eT4dG+cqb8PIli1b1NDQoPXr12vv3r2aO3euFi9erFOnTtldmi0uvfRSnTx5Mvl49tln7S4pp4LBoObOnatNmzYN+vkDDzyg733ve9q8ebOef/55FRUVafHixeru7s5xpbkx0v6QpOuuuy7lmPnlL3+Zwwpza+fOnVq9erX++te/6sknn1RPT4+uvfZaBYPB5Dq33367fve73+nRRx/Vzp07deLECd144402Vm2ddPaHJK1cuTLlGHnggQdsqthaU6ZM0f333689e/bohRde0NVXX63rr79er776qqT8OjbOmclTCxcuNKtXr06+j0QiZtKkSaaxsdHGquyxfv16M3fuXLvLGDUkma1btybfR6NRU1VVZR588MHkstOnTxufz2d++ctf2lBhbg3cH8YYs3z5cnP99dfbUs9ocOrUKSPJ7Ny50xgTOx48Ho959NFHk+u8/vrrRpLZtWuXXWXmzMD9YYwxH/7wh81tt91mX1E2GzdunPnRj36U98dGuvKyZSQcDmvPnj2qr69PLnM6naqvr9euXbtsrMw+Bw4c0KRJkzRjxgx9/vOf19GjR+0uadQ4cuSImpubU46XsrIy1dbW5u3xIkk7duzQxIkTNWvWLN1yyy1655137C4pZ9rb2yVJF1xwgSRpz5496unpSTlGLrnkEl144YV5cYwM3B8JP//5z1VRUaHLLrtMa9euVVdXlx3l5VQkEtEjjzyiYDCourq6vD820jUm7tqbbW1tbYpEIqqsrExZXllZqTfeeMOmquxTW1urn/70p5o1a5ZOnjype+65R4sWLdIrr7yikpISu8uzXXNzsyQNerwkPss31113nW688UZNnz5dhw4d0je/+U19/OMf165du+Ryuewuz1LRaFRf//rXdeWVV+qyyy6TFDtGvF6vysvLU9bNh2NksP0hSTfddJOmTp2qSZMm6aWXXtIdd9yh/fv369e//rWN1Vrn5ZdfVl1dnbq7u1VcXKytW7dq9uzZ2rdvX94eG5nIyzCCVB//+MeTr+fMmaPa2lpNnTpVv/rVr/TlL3/ZxsowWn32s59Nvr788ss1Z84czZw5Uzt27NA111xjY2XWW716tV555ZW8G1c1lKH2x80335x8ffnll6u6ulrXXHONDh06pJkzZ+a6TMvNmjVL+/btU3t7ux577DEtX75cO3futLusMSMvu2kqKirkcrnOGs3c0tKiqqoqm6oaPcrLy3XxxRfr4MGDdpcyKiSOCY6Xoc2YMUMVFRXn/TFz66236ve//72eeeYZTZkyJbm8qqpK4XBYp0+fTln/fD9Ghtofg6mtrZWk8/YY8Xq9uuiii7RgwQI1NjZq7ty5+u53v5u3x0am8jKMeL1eLViwQE1NTcll0WhUTU1Nqqurs7Gy0SEQCOjQoUOqrq62u5RRYfr06aqqqko5Xjo6OvT8889zvMT97W9/0zvvvHPeHjPGGN16663aunWrnn76aU2fPj3l8wULFsjj8aQcI/v379fRo0fPy2NkpP0xmH379knSeXuMDBSNRhUKhfLu2Dhndo+gtcsjjzxifD6f+elPf2pee+01c/PNN5vy8nLT3Nxsd2k590//9E9mx44d5siRI+Yvf/mLqa+vNxUVFebUqVN2l5YznZ2d5sUXXzQvvviikWQ2bNhgXnzxRfP2228bY4y5//77TXl5uXn88cfNSy+9ZK6//nozffp0c+bMGZsrt8Zw+6Ozs9N84xvfMLt27TJHjhwxTz31lPnABz5g3ve+95nu7m67S7fELbfcYsrKysyOHTvMyZMnk4+urq7kOqtWrTIXXnihefrpp80LL7xg6urqTF1dnY1VW2ek/XHw4EHzrW99y7zwwgvmyJEj5vHHHzczZswwV111lc2VW2PNmjVm586d5siRI+all14ya9asMQ6Hw/zxj380xuTXsXGu8jaMGGPMf/7nf5oLL7zQeL1es3DhQvPXv/7V7pJssXTpUlNdXW28Xq+ZPHmyWbp0qTl48KDdZeXUM888YySd9Vi+fLkxJnZ571133WUqKyuNz+cz11xzjdm/f7+9RVtouP3R1dVlrr32WjNhwgTj8XjM1KlTzcqVK8/rID/YvpBkfvKTnyTXOXPmjPnqV79qxo0bZwoLC82nP/1pc/LkSfuKttBI++Po0aPmqquuMhdccIHx+XzmoosuMv/8z/9s2tvb7S3cIl/60pfM1KlTjdfrNRMmTDDXXHNNMogYk1/HxrlyGGNM7tphAAAAUuXlmBEAADB6EEYAAICtCCMAAMBWhBEAAGArwggAALAVYQQAANiKMAIAAGxFGAEAALYijAAAAFsRRgAAgK0IIwAAwFb/H+UxgHX8+3AwAAAAAElFTkSuQmCC"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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IYykgRV7AQCwDmEkDakVez3UjAAAkG2EkTTQZwQAAOsQRtLAaBoAAKxDGElDap4RH2EEAIBsO6UwsmnTJjU0NMjn86mxsVG7d+8e9/gTJ05o3bp1qq2tldfr1XnnnacnnnjilApsB5ppAACwTsZ31y1btqilpUWbN29WY2OjHnjgAS1fvlwHDhxQVVXVSceHw2F94hOfUFVVlR599FHNnDlTb7/9tioqKrJR/pwIJIb2MpoGAIDsyziM3H///Vq7dq3WrFkjSdq8ebO2bdumhx56SLfddttJxz/00EN6//339fzzz8vtdkuSGhoaTq/UOcZoGgAArJNRM004HNaePXvU3Nw8+AecTjU3N2vXrl2jfuaXv/ylmpqatG7dOlVXV2vBggW65557FI1Gx/yeUCgkv98/7GEnOrACAGCdjMJIV1eXotGoqqurh+2vrq5We3v7qJ9588039eijjyoajeqJJ57QnXfeqW9961v653/+5zG/p7W1VeXl5alHfX19JsXMOvqMAABgHctH08RiMVVVVekHP/iBli5dqpUrV+r222/X5s2bx/zM+vXr1d3dnXocPXrU6mKOq5cwAgCAZTK6u1ZWVsrlcqmjo2PY/o6ODtXU1Iz6mdraWrndbrlcg50/P/ShD6m9vV3hcFgej+ekz3i9Xnm93kyKZhljjALhZAdWwggAANmWUc2Ix+PR0qVL1dbWltoXi8XU1tampqamUT9z8cUX6+DBg4rFYql9r7/+umpra0cNIpNNMBJTNGYkMc8IAABWyLiZpqWlRQ8++KD+/d//Xa+99pquv/56BQKB1OiaVatWaf369anjr7/+er3//vu68cYb9frrr2vbtm265557tG7duuz9KyyUbKKRpCI3Q3sBAMi2jH/qr1y5Up2dndqwYYPa29u1ePFibd++PdWp9ciRI3I6BzNOfX29nnzySd18881auHChZs6cqRtvvFG33npr9v4VFkp1XvW45HQ6bC4NAABnHocxxthdiIn4/X6Vl5eru7tbZWVlOf3uV9/p1l995zlVlXq1+/bmiT8AAAAkpX//Zm2aCTDHCAAA1iKMTCAQZlgvAABWIoxMoDexLk0x69IAAGAJwsgEBptp3DaXBACAMxNhZAK9wWQYoWYEAAArEEYmwFTwAABYizAyAUbTAABgLcLIBBhNAwCAtQgjExgcTUMYAQDA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vn371N3drUcffVSrV6/Wzp077S7WlJGXzTSVlZVyuVwn9Wbu6OhQTU2NTaWaPCoqKnTeeefp4MGDdhdlUkheE1wvY5s7d64qKyvP+Gvmhhtu0K9//Ws988wzmjVrVmp/TU2NwuGwTpw4Mez4M/0aGet8jKaxsVGSzthrxOPx6JxzztHSpUvV2tqqRYsW6dvf/nbeXhuZyssw4vF4tHTpUrW1taX2xWIxtbW1qampycaSTQ69vb06dOiQamtr7S7KpDBnzhzV1NQMu178fr9eeOEFrpeEP/3pT3rvvffO2GvGGKMbbrhBW7du1W9/+1vNmTNn2PtLly6V2+0edo0cOHBAR44cOSOvkYnOx2j27dsnSWfsNTJSLBZTKBTKu2vjlNndg9YujzzyiPF6vebhhx82f/zjH821115rKioqTHt7u91Fy7mvfOUrZseOHebw4cPmd7/7nWlubjaVlZXm+PHjdhctZ3p6esxLL71kXnrpJSPJ3H///eall14yb7/9tjHGmHvvvddUVFSYxx9/3Lz88svmqquuMnPmzDH9/f02l9wa452Pnp4ec8stt5hdu3aZw4cPm6efftp8+MMfNueee64JBoN2F90S119/vSkvLzc7duwwx44dSz36+vpSx1x33XXm7LPPNr/97W/Niy++aJqamkxTU5ONpbbOROfj4MGD5u677zYvvviiOXz4sHn88cfN3LlzzaWXXmpzya1x2223mZ07d5rDhw+bl19+2dx2223G4XCY//zP/zTG5Ne1caryNowYY8x3vvMdc/bZZxuPx2OWLVtmfv/739tdJFusXLnS1NbWGo/HY2bOnGlWrlxpDh48aHexcuqZZ54xkk56rF692hgTH9575513murqauP1es3ll19uDhw4YG+hLTTe+ejr6zNXXHGFmTFjhnG73Wb27Nlm7dq1Z3SQH+1cSDI//vGPU8f09/ebL3/5y2batGmmqKjIfPrTnzbHjh2zr9AWmuh8HDlyxFx66aXmrLPOMl6v15xzzjnmH//xH013d7e9BbfI3//935vZs2cbj8djZsyYYS6//PJUEDEmv66NU+Uwxpjc1cMAAAAMl5d9RgAAwORBGAEAALYijAAAAFsRRgAAgK0IIwAAwFaEEQAAYCvCCAAAsBVhBAAA2IowAgAAbEUYAQAAtiKMAAAAWxFGAACArf4/r/kPS4R0CtoAAAAASUVORK5CYII="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练神经网络\n",
    "\n",
    "import numpy as np\n",
    "from dataset.mnist import load_mnist\n",
    "from common import draw\n",
    "\n",
    "# 加载训练数据\n",
    "(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, flatten=True, one_hot_label=True)\n",
    "\n",
    "# 超参数\n",
    "iters_num = 20000       # 训练轮数\n",
    "train_size = x_train.shape[0]   # 训练数据量\n",
    "batch_size = 100        # 单批次数量\n",
    "learning_rate = 0.1     # 学习率\n",
    "\n",
    "# 训练数据损失函数值\n",
    "train_loss_list = []\n",
    "# 训练数据精确度\n",
    "train_acc_list = []\n",
    "# 测试数据精确度\n",
    "test_acc_list = []\n",
    "# 每个epoch重复次数\n",
    "iter_per_epoch = max(train_size / batch_size, 1)\n",
    "\n",
    "# 构建神经网络对象\n",
    "network = TwoLayerNet(input_size=784, hidden_size=50, output_size=10)\n",
    "\n",
    "for i in range(iters_num):\n",
    "    # 获取小批量数据\n",
    "    batch_mask = np.random.choice(train_size, batch_size)\n",
    "    x_batch = x_train[batch_mask]\n",
    "    t_batch = t_train[batch_mask]\n",
    "\n",
    "    # 计算梯度\n",
    "    grad = network.gradient(x_batch, t_batch)\n",
    "\n",
    "    # 更新参数\n",
    "    for key in ('W1', 'b1', 'W2', 'b2'):\n",
    "        network.params[key] -= learning_rate * grad[key]\n",
    "\n",
    "    # 记录学习过程\n",
    "    loss = network.loss(x_batch, t_batch)\n",
    "    train_loss_list.append(loss)\n",
    "\n",
    "    # 计算每个epoch的识别精度\n",
    "    if i % iter_per_epoch == 0:\n",
    "        train_acc = network.accuracy(x_train, t_train)\n",
    "        test_acc = network.accuracy(x_test, t_test)\n",
    "        train_acc_list.append(train_acc)\n",
    "        test_acc_list.append(test_acc)\n",
    "        print(i, \"train acc, test acc |\" + str(train_acc) + \", \" + str(test_acc))\n",
    "\n",
    "draw.draw_list(train_loss_list)\n",
    "draw.draw_list(train_acc_list)\n",
    "draw.draw_list(test_acc_list)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}